package com.cvpoc.struts.action;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.LabelValueBean;
import org.springframework.web.struts.DispatchActionSupport;

import com.cvpoc.dto.CollaborateurLangueDTO;
import com.cvpoc.dto.LangueDTO;
import com.cvpoc.exception.BusinessException;
import com.cvpoc.service.LangueService;
import com.cvpoc.struts.form.LangueForm;

public class LangueAction extends DispatchActionSupport {
	
	private static final int ID_COL = 1;

	/* [consulter] ********************************************/
	
	/**
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 * 
	 */
	
	public ActionForward consulterListeLangue(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
			
		try {
			LangueService langueService = (LangueService) getWebApplicationContext().getBean("langueService");
			List<CollaborateurLangueDTO> languesDTO = langueService.rechercherListLanguesByIdCollaborateur(ID_COL);
			request.setAttribute("langues", languesDTO);
			return mapping.findForward("successAfficherListeLangue");
		}catch (BusinessException e) {
			return mapping.findForward("failureAfficherListeLangue");
		}
	}
	
	/* [ajouter] ********************************************/
	
	public ActionForward ajouterLangue(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		try {
			LangueService langueService = (LangueService) getWebApplicationContext().getBean("langueService");
			List<LangueDTO> listeLangue = langueService.rechercherListeLangue();
			
			LangueForm langueForm = (LangueForm) form;
			
			ArrayList langueList = new ArrayList();
			
			if(listeLangue.size() < 1) {
				return mapping.findForward("failureAjouterLangue");
			}
			
			for(LangueDTO langueDTO : listeLangue) {
				langueList.add(new LabelValueBean(langueDTO.getLibelle(),String.valueOf(langueDTO.getId())));
			}
			
			langueForm.setLangueList(langueList);
			return mapping.findForward("successAjouterLangue");
		}catch (BusinessException e) {
			return mapping.findForward("failureAjouterLangue");
		}
	}
	
	/* [enregistrer ajouter] ********************************************/
	
	/**
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 * 
	 */
	
	public ActionForward enregistrerLangue(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		try {
			LangueService langueService = (LangueService)getWebApplicationContext().getBean("langueService");
			LangueForm langueForm 		= (LangueForm) form;
			langueForm.setLibelle(langueForm.getSelectedItem());
	    	LangueDTO langueDTO			= langueService.rechercherLangueBydIdLangue(Integer.parseInt(langueForm.getLibelle()));
	    	
	    	CollaborateurLangueDTO collaborateurLangueDTO = setCollaborateurLangueDTO(langueForm, langueDTO);
	
	    	langueService.ajouterCollaborateurLangue(collaborateurLangueDTO);
			return mapping.findForward("successEnregistrerLangue");
		}catch (BusinessException e) {
			return mapping.findForward("failureEnregistrerLangue");
		}
	}
	
	/**
	 * 
	 * @param formulaire
	 * @param langueDTO
	 * @return
	 * 
	 */
	
	private CollaborateurLangueDTO setCollaborateurLangueDTO(
			LangueForm formulaire, LangueDTO langueDTO) {
		CollaborateurLangueDTO collaborateurLangueDTO = new CollaborateurLangueDTO();
    	
    	collaborateurLangueDTO.setId_collaborateur(ID_COL);
    	collaborateurLangueDTO.setLangue(langueDTO);
    	collaborateurLangueDTO.setNiveau(formulaire.getNiveau());
    	collaborateurLangueDTO.setPratique(formulaire.getPratique());
    	collaborateurLangueDTO.setCommentaire(formulaire.getCommentaire());
		return collaborateurLangueDTO;
	}	
	
	/* [modifier] ********************************************/	
	
	/**
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 * 
	 */
	
	public ActionForward afficherModifierLangue(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		try {
			LangueService langueService = (LangueService) getWebApplicationContext()
					.getBean("langueService");
	
			LangueForm langueForm		= (LangueForm) form;	

			List<LangueDTO> listeLangue = langueService.rechercherListeLangue();
			
			if(listeLangue.size() < 1) {
				return mapping.findForward("failureAfficherModifierLangue");
			}
			
			if(Integer.valueOf(request.getParameter("idLangue")) == 0) {
				return mapping.findForward("failureAfficherModifierLangue");
			} 		
		
			ArrayList langueList 		= new ArrayList();
			
			for(LangueDTO langueDTO : listeLangue) {
				langueList.add(new LabelValueBean(langueDTO.getLibelle(),String.valueOf(langueDTO.getId())));
			}
			
			langueForm.setLangueList(langueList);
			
			CollaborateurLangueDTO collaborateurLangueDTO = langueService.rechercherLangueBydIdCollaborateur(Integer.valueOf(request.getParameter("idLangue")), ID_COL);		
			
			if(collaborateurLangueDTO.getId_collaborateur() == 0) {
				return mapping.findForward("failureAfficherModifierLangue");
			}
			
			// on set les champs qui seront affichés ou posté.
			langueForm.setCommentaire(collaborateurLangueDTO.getCommentaire());
			langueForm.setNiveau(collaborateurLangueDTO.getNiveau());
			langueForm.setPratique(collaborateurLangueDTO.getPratique());	
			
			// on récupère la valeur en provenance de la base et on la définit en valeur par défaut.
			langueForm.setSelectedItem(Integer.toString(collaborateurLangueDTO.getLangue().getId()));
			
			return mapping.findForward("successAfficherModifierLangue");
		}catch (BusinessException e) {
			return mapping.findForward("failureAfficherModifierLangue");
		}
	}
	
	/* [enregistrer modifier] ********************************************/	
	
	/**
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 * 
	 */
	
	public ActionForward enregisterModifierLangue(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {	
		
		try {
			
			LangueService langueService = (LangueService) getWebApplicationContext()
					.getBean("langueService");
			
			ArrayList langueList 	= new ArrayList();
			LangueForm langueForm 	= (LangueForm) form;
			langueForm.setLibelle(langueForm.getSelectedItem());
	    	LangueDTO langueDTO		= langueService.rechercherLangueBydIdLangue(Integer.parseInt(langueForm.getLibelle()));
	    	
	    	langueForm.setLangueList(langueList);
	    	CollaborateurLangueDTO collaborateurLangueDTO = setCollaborateurLangueDTO(langueForm, langueDTO);;
			langueService.modifierCollaborateurLangue(collaborateurLangueDTO);
			
			return mapping.findForward("successEnregistrerModifierLangue");
		}catch (BusinessException e) {
			return mapping.findForward("failureEnregistrerModifierLangue");
		}
	}
	
	/**
	 * 
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 * 
	 */
	
	public ActionForward supprimerLangue(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {	
		try {
			LangueService langueService = (LangueService) getWebApplicationContext()
					.getBean("langueService");
			
			if(Integer.valueOf(request.getParameter("idLangue")) == 0) {
				return mapping.findForward("failureSupprimerLangue");
			} 	
			
			CollaborateurLangueDTO collaborateurLangueDTO = langueService.rechercherLangueBydIdCollaborateur(Integer.valueOf(request.getParameter("idLangue")), ID_COL);
			
			if(collaborateurLangueDTO.getId_collaborateur() == 0) {
				return mapping.findForward("failureSupprimerLangue");
			}
			
			langueService.supprimerCollaborateurLangue(collaborateurLangueDTO);
			
			return mapping.findForward("successSupprimerLangue");
		}catch (BusinessException e) {
			return mapping.findForward("failureSupprimerLangue");
		}
	}
}
